package SecondeStage.FanXing;

import java.util.ArrayList;

@SuppressWarnings({"all"})
public class Generic {
    public static void main(String[] args) {
        ArrayList<Dog> arrayList =new ArrayList();
        //1. 当我们 ArrayList<Dog>表示存放到 ArrayList集合中的元素是Dog类型
        //2. 如果编译器发现添加的类型不满足要求，就会报错
        //3. 在遍历的时候，可以直接取出Dog类型而不是Object
        arrayList.add(new Dog("旺财",10));
        arrayList.add(new Dog("发财",1));
        arrayList.add(new Dog("小黄",5));
        //arrayList.add(new Cat("小七",3)); // 报错
        for (Dog dog :arrayList) {
            System.out.println(dog.getName()+"-"+dog.getAge());
        }

        Person<String> person =new Person<String>("hsp");
    }
}
// 泛型的作用是：可以在类声明时通过一个标识符表示类中某个属性的类型，或者是某个方法的返回值类型，或者是参数类型
class Person<E>{
    E s; // E表示s的数据类型，该数据类型在定义Person对象的时候指定，即在编译期间，就确定E是什么类型

    public Person(E s){ // E也可以是参数类型
        this.s=s;
    }

    public E f(){ // E也可以是返回类型
        return s;
    }
}

class Dog{
    private String name;
    private int age;

    public Dog(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

class Cat{
    private String name;
    private int age;

    public Cat(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}


